package head.adapter;

/**
 * DESC 适配器：将一个类的接口，转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
 *      外观模式（也即门面模式，Facade）：提供了一个统一的接口，用来访问子系统中的一群接口。外观模式定义了一个高级接口，让子系统更容易被使用。
 * 
 * ---- 装饰者/适配器/外观模式：
 *   -- 1、装饰者：不改变接口，但改变责任
 *   -- 2、适配器： 将一个接口，变为另外一个接口
 *   -- 3、外观模式：让接口更简单（即将内部一大堆接口简化为对外一个或者几个接口来使用）
 *   
 *   
 * ---- 适配器对象模式实现：
 *   -- 1、要使用是配置，至少有两个类，即目标类，想被适配成其他类的类
 *   -- 2、创建一个具体的适配器类，继承自目标类。同时持有一个被适配类对象的引用（该引用对象值通过构造方法赋值）。
 *   -- 3、其中具体适配器类覆盖重写目标类中的方法，在覆盖重写的方法中，调用持有的被适配类对象的引用的方法，来实现适配目的
 *   -- 【注:装饰者模式中：主体类和抽象装饰者类都继承自同一个接口，具体装饰者继承自抽象装饰者类。（所有的类都继承自一个统一的高层接口）】
 *   
 *   
 * ---- 适配器类模式实现：   
 *   -- 1、创建一个适配器类，继承自目标类与被适配类（注：java不支持多重继承）
 *   -- 2、覆盖重写目标类方法，达到适配作用
 *   
 *   
 * ---- 最少知识原则(对象方法内调用属于以下范围的方法)：
 *   -- 1、该对象本省的方法
 *   -- 2、被当作方法参数传递进来对象的方法
 *   -- 3、此方法所创建或实例化的对象的方法
 *   -- 4、对象持有的其他对象的引用（类组合对象）对象的方法
 *   
 * ---- jdk适配器使用场景：
 *   -- java.util.Arrays#asList()将数组array适配层list
 *   -- 将jdk低版本的枚举变为迭代器（hasMoreElements适配为->hasNext）
 *   
 * ---- 将fw.jd.com服务市场的，原始单账号功能，
 * ---- 每次判断商品是否为父账号商品，则直接适配为判断为父或者子账号的商品
 *   
 * @author ttx
 * @since 2016年2月13日 下午6:06:17
 */
public class Client {
	
	public static void main(String[] args) {
		Car car = new Car();
		car.driver();
		
		car = new BikeAdapter(new Bike());
		car.driver();
	}
}
